const {
    BedType
} = require('./BedType');
const {
    RoomType
} = require('./RoomType');
const {
    Role
} = require('./Role');
const {
    User
} = require('./User');
const fsPromises = require('fs').promises;
const path = require('path');
// hash密码
const bcrypt = require('bcryptjs');

// 获取需要导入数据库的初始化数据，传入相对当前目录的文件路径
async function getConstData(filePath) {
    return await fsPromises.readFile(
        path.join(__dirname, filePath), {
            encoding: "utf8",
            flag: "r"
        });
}

/**
 * 
 * @param {Model} model 需要保存至的模型对象
 * @param {String} filePath 需要保存到数据库的数据文件路径
 * @param {Array} conditionKeys 保证数据唯一性的字段名称字符串列表
 */
async function initModelData(model, filePath, conditionKeys) {
    // 读取数据
    const fileStr = await getConstData(filePath);
    const data = JSON.parse(fileStr);
    // 得到解析的promise数组
    const promises = data.map(async item => {
        const condition = {};
        conditionKeys.forEach(key => condition[key] = item[key]);
        const res = await model.findOne(condition);
        !res && model.create(item);
    })
    // 等待所有操作完成
    await Promise.all(promises);
}

async function init() {
    // 初始化床型数据
    await initModelData(BedType, '../const/bedTypes.json', ['title']);

    // 初始化房型数据
    await initModelData(RoomType, '../const/roomTypes.json', ['title']);

    // 初始化角色数据
    await initModelData(Role, '../const/roles.json', ['rid']);

    // 初始化Eki用户
    User.findOne({
        account: 'eki_0354',
        nickname: 'Eki'
    }).then(async result => {
        if (result == null) {
            // 生成盐
            const salt = await bcrypt.genSalt(10);
            // 使用盐对密码进行加密
            const motoPwd = '0354';
            const password = await bcrypt.hash(motoPwd, salt);
            // 获取Eki的角色ID
            const role = await Role.findOne({
                rid: 0
            });
            await User.create({
                nickname: 'Eki',
                account: 'eki_0354',
                realName: '亦旻',
                role: role._id,
                phone: 're0bhgfgeg ',
                password: password,
                motoPwd: motoPwd,
                createTime: new Date,
                status: true
            });
        }
    });
}

init();